package cn.ljy.authority.dao.mapper;

import cn.ljy.authority.dao.BaseMapper;
import cn.ljy.authority.model.SysPermission;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;

import java.io.Serializable;
import java.util.List;

@Mapper
public interface SysPermissionMapper extends BaseMapper<SysPermission> {

    /**
     * 根据组件名查找数据库中重名的数量
     * @param component
     * @return 返回重名数
     */
    @Select("select count(1) from sys_permission where component=#{component}")
    int countByComponent(String component);

    /**
     * 根据组件名查找数据库中重名的数量
     * @param component
     * @return 返回重名数
     */
    @Select("select count(1) from sys_permission where component=#{component} and id!=#{id}")
    int countByComponentAndIdNot(String component, Serializable id);

    /**
     * 根据账户信息读取出所有的权限信息
     * @param userId
     * @param roleEnabled 角色是否可用。如果传递的是null则查询所有角色
     * @return
     */
    List<SysPermission> findByUserIdAndRoleEnabled(long userId,Boolean roleEnabled);

    /**
     * 根据账户信息读取出所有的权限信息
     * @param userId
     * @param roleEnabled 角色是否可用。如果传递的是null则查询所有角色
     * @return
     */
    int countByUserIdAndRoleEnabled(long userId,Boolean roleEnabled);


    /**
     * 获取数据库指定权限及其所有子权限（递归），以树形方式存储
     * @return
     */
    List<SysPermission> findTree();

    /**
     * 获取数据库指定权限及其所有子权限（递归），以树形方式存储
     * 说明：只包含权限的菜单类型
     * @return
     */
    List<SysPermission> findTreeMenu();


    /**
     * 读取该账户拥有的所有权限id
     * 说明：
     * 1.建议加载显示菜单时。只有角色启用的权限才读取。
     * 2.非树形目录，没有层级关系，需要在业务层自己处理
     * @param userId
     * @param roleEnabled 如果为true，表示必须是有效的角色才能拥有权限
     * @return
     */
    Long[] findIdsByUserIdAndRoleEnabled(long userId,boolean roleEnabled);

}
